﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.IO;
using tea.DB;
using tea.BL;

namespace tea.Controllers
{
    [Authorize]
    public class ImageController : Controller
    {
        static int 이미지크기제한 = 2; // 정보: 단위 메가

        static ImageController() {
            int.TryParse(System.Configuration.ConfigurationManager.AppSettings["ImageUploadSizeMax"], out 이미지크기제한);
        }
        
        [HttpPost]
        public ActionResult Upload(HttpPostedFileBase Filedata)
        {
            using (var db = new DBDataContext()) {
                string 파일명 = Path.GetFileName(Filedata.FileName);
                var 크기 = (int)Filedata.InputStream.Length;
                if (크기 > 이미지크기제한 * 1024 * 1024) throw new Exception(Consts.파일크기오류);
                var 버퍼 = new byte[크기];
                Filedata.InputStream.Read(버퍼, 0, 크기);

                var 새이미지 = new 파일 { 크기 = 크기, 파일명 = 파일명, 내용 = 버퍼, 생성일 = DateTime.Now, 임시 = true };
                db.파일.InsertOnSubmit(새이미지);
                db.SubmitChanges();

                string callback = Request.Form["callback"];
                string callback_func = Request.Form["callback_func"];
                string returnUrl = string.Format("{0}?callback_func={1}&bNewLine=true&sFileName={2}&size={3}&sFileURL=/Image/Download/{4}", callback, callback_func, 파일명, Filedata.ContentLength, 새이미지.ID);
                return Redirect(returnUrl);
            }
        }

        // 정보: HTML5 브라우저
        [HttpPost]
        public ActionResult Upload5(HttpPostedFileBase[] Filedata)
        {
            using (var db = new DBDataContext()) {
                string 파일명 = Path.GetFileName(Filedata[0].FileName);
                var 크기 = (int)Filedata[0].InputStream.Length;
                if (크기 > 이미지크기제한) throw new Exception(Consts.파일크기오류);
                var 버퍼 = new byte[크기];
                Filedata[0].InputStream.Read(버퍼, 0, 크기);

                var 새이미지 = new 파일 { 크기 = 크기, 파일명 = 파일명, 내용 = 버퍼, 생성일 = DateTime.Now, 임시 = true };
                db.파일.InsertOnSubmit(새이미지);
                db.SubmitChanges();

                string callback = Request.Form["callback"];
                string callback_func = Request.Form["callback_func"];
                string returnUrl = string.Format("{0}?callback_func={1}&bNewLine=true&sFileName={2}&size={3}&sFileURL=/Image/Download/{4}", callback, callback_func, 파일명, Filedata[0].ContentLength, 새이미지.ID);
                return Redirect(returnUrl);
            }
        }

        [HttpGet]
        public ActionResult Download(long id)
        {
            using (var db = new DBDataContext()) {
                var 이미지 = db.파일.Single(p => p.ID == id);
                return File(이미지.내용.ToArray(), 이미지.파일명);
            }
        }

        // 정보: 크롬 브라우저에서 이미지 붙여넣기에 의한 업로드 구현
        public JsonResult Paste(string data, string contenttype)
        {
            byte[] 버퍼 = Convert.FromBase64String(data);
            string 파일명 = "PastedImage";
            var 크기 = 버퍼.Length;

            using (var db = new DBDataContext()) {
                var 새이미지 = new 파일 {  크기 = 크기, 파일명 = 파일명, 내용 = 버퍼, 생성일 = DateTime.Now, 임시 = true };
                db.파일.InsertOnSubmit(새이미지);
                db.SubmitChanges();
                return Json(new { success = true, url = string.Format("/Image/Download/{0}", 새이미지.ID) });
            }
        }
    }
}
